<?php
/**
 * Controller_Message
 *
 * Класс Controller_Message отвечает за работу с сообщениями
 *
 */
class Controller_Message extends Controller_Base {

	/**
	 * Выбор действия по URL
	 *
	 */
	public function action() {
		Service_Debug::setDebug();
		switch ($this->arrRequest[1]) {
			case '':
				$objSession = User_Session::instance();
				if($objSession->isLoggedIn()) {
						if (isset($_GET['del'])) { // Если в массиве GET есть соответствующий удалению ключ
							if (preg_match("/^[1-9]{1}[\d]*$/",$_GET['del'])) { // Если номер сообщения указан корректно
								$messageId = $_GET['del'];
								$currentUserId = $objSession->getUserId();
								$objMessage = new Message($messageId);
								// Если существует сообщение с заданным id и текущий пользователь - адресат или отправитель
								if ($objMessage->id) {
									if ($currentUserId == $objMessage->getField('ID_user')) $this->actionDelete($objMessage,'deleted_by_user');
									elseif ($currentUserId == $objMessage->getField('ID_user_to')) $this->actionDelete($objMessage,'deleted_by_userto');
									else $this->setError(404);
								}
								else $this->setError(404);
							}
							else $this->setError(404);
						}
						elseif(isset($_GET['user'])) {// Проверка на страницу переписки с конкретным пользователем
							$userId = $_GET['user'];
							$objUser = new User_User($userId);
							if($objUser->id &&  $objUser != $objSession->getUser()) {// Если есть пользователь в БД с id из массива GET и переписка не с самим собой
								if(isset($_GET['page'])) $pageNumber = $_GET['page']; // Записываем номер страницы, которую нужно показать
								else $pageNumber = 1; // По умолчанию выводим первую страницу
									
								$objMessage = new Message();
								// Считаем количество страниц для текущей навигации и проверяем корректность данных из GET
								$arrMessages = $objMessage->find('all', array( 'select' => '`message`.`ID_message`,`message`.`ID_user_to`,`message`.`text`, `message`.`created_at`, `message`.`is_read_at`,`user`.`first_name`,`user`.`user_type`,`user`.`ID_user`',
	 								 	 'joins' => 'INNER JOIN `user` USING(`ID_user`)',
	 							     	 'conditions' => "(`message`.`ID_user` = '" . $objUser->id . "' AND `message`.`ID_user_to`='" . User_User::getId() ."' AND `message`.`deleted_by_userto` IS NULL) OR (`message`.`ID_user` = '" . User_User::getId() . "' AND `message`.`ID_user_to`='" .  $objUser->id ."' AND `message`.`deleted_by_user` IS NULL)",
	 									 'order' => '`message`.`created_at` DESC'));
								$essenceCount = count($arrMessages);
								$pagesNumber = ceil($essenceCount / $objMessage->essenceNumberOnPage); // Необходимое количество страниц для навигации
								// Если GET пуст или в нём указан правильный номер страницы
								if(!isset($_GET['page']) || ($pageNumber <= $pagesNumber && preg_match("/^[1-9]{1}[\d]*$/",$pageNumber))) $this->actionOne($objMessage,$objUser,&$arrMessages,$pagesNumber,$pageNumber);
								else $this->setError(404);
							}
							else $this->setError(404);
						}
						else { // Страница последней переписки пользователя
							if(isset($_GET['page'])) $pageNumber = $_GET['page']; // Записываем номер страницы, которую нужно показать
							else $pageNumber = 1; // По умолчанию выводим первую страницу
							
							$objMessage = new Message();
							// Считаем количество страниц для текущей навигации и проверяем корректность данных из GET
							$arrMessages = $objMessage->getArrMessages();
							$essenceCount = count($arrMessages);
							$pagesNumber = ceil($essenceCount / $objMessage->essenceNumberOnPage); // Необходимое количество страниц для навигации
							// Если GET пуст или в нём указан правильный номер страницы
							if(!isset($_GET['page']) || ($pageNumber <= $pagesNumber && preg_match("/^[1-9]{1}[\d]*$/",$pageNumber))) $this->actionList(&$arrMessages,$pagesNumber,$pageNumber);
							else $this->setError(404);
						}
				}
				else $this->setError(404);
			  break;
			default:
				$this->setError(404);
				break;
		}
	}

	/**
	 * Выводит последнюю переписку пользователя
	 *
	 */
	public function actionList($arrMessages,$pagesNumber,$pageNumber) {
		Service_Debug::setDebug();
		$objMessage = new Message();
		$this->title = $this->pageHead = 'Последние сообщения';
		$objViewMessage = new View_Message();
		// Номер первого отображаемого сообщения на странице
		$firsMessage = ($pageNumber - 1) * $objMessage->essenceNumberOnPage;
		// Номер последней отображаемой статьи на странице
		$lastMessage = $firsMessage + $objMessage->essenceNumberOnPage;
		$resultArrMessages = array();
		for ($k = $firsMessage; $k < $lastMessage; $k++) {
			if (isset($arrMessages[$k])) $resultArrMessages[] = $arrMessages[$k];
		}
		
		$this->bodyAttrs = 'class="messages-history"';
		$this->showHeader();
		$objViewMessage->showAdminList($resultArrMessages,$pagesNumber,$pageNumber);
		$this->showFooter();
	
	}
	
	/**
	 * Выводит страницу переписки с конкретным пользователем и форму отправки нового сообщения
	 *
	 */
	public function actionOne($objMessage,$objUser,$arrMessages,$pagesNumber,$pageNumber) {
		Service_Debug::setDebug();
		if (isset($_POST['Message'])) {
			$objMessage = new Message($_POST['Message']);
			if ($objMessage->save()) User_Session::moveTo(W_ABSPATH . 'messages?user=' . $objUser->id, 'Сообщение отправлено', 1);
		}
	
	 	
	 	$this->title = $objUser->getField('first_name') . ' ' . $objUser->getField('last_name');
		$objViewMessage = new View_Message();
		$this->bodyAttrs = 'class="messages-chat"';
	 	$this->showHeader();
	 	// Номер первого отображаемого сообщения на странице
	 	$firsMessage = ($pageNumber - 1) * $objMessage->essenceNumberOnPage;
	 	// Номер последней отображаемой статьи на странице
	 	$lastMessage = $firsMessage + $objMessage->essenceNumberOnPage;
	 	$resultArrMessages = array();
	 	for ($k = $firsMessage; $k < $lastMessage; $k++) {
	 		if (isset($arrMessages[$k])) $resultArrMessages[] = $arrMessages[$k];
	 	}
	 	$objViewMessage->showChat($resultArrMessages,$objUser,$pagesNumber,$pageNumber);
	 	$this->showFooter();
	}
	
	/**
	* Осуществялет удаление сообщения
	*
	* @param Message $objMessage -  объект сообщения для удаления
	* @param string $whoIsDelete - статус пользователя, который удаляет сообщение (отправитель или получатель)
	*/
	public function actionDelete($objMessage, $whoIsDelete) {
		Service_Debug::setDebug();
		// Записываем id собеседника
		if ($whoIsDelete == 'deleted_by_userto') $interlocutorId = $objMessage->getField('ID_user');
		else $interlocutorId = $objMessage->getField('ID_user_to');
		// Отмечаем сообщение как удаленное текущим пользователем
		$objMessage->updateField($whoIsDelete, 1);
		// Если оба пользователя уже удалили это сообщение, то удаляем его из БД
		if ($objMessage->getField('deleted_by_user') == 1 && $objMessage->getField('deleted_by_userto') == 1 ) $objMessage->delete();
		User_Session::moveTo(W_ABSPATH . 'messages?user=' . $interlocutorId, 'Сообщение удалено', 1);
	}
}
?>